package org.bit.practice01;

import java.util.Random;

public class Demo02 {
    public static void main(String[] args) throws InterruptedException {
        // 记录开始时间
        long start = System.currentTimeMillis();

        // 给定一个很长的数组 (长度 1000w), 通过随机数的方式生成 1-100 之间的整数.
        int total = 1000_0000;
        int[] array = new int[total];
        Random random = new Random();
        for (int i = 0; i < total; i++) {
            array[i] = random.nextInt(100) + 1;
        }

        // 实现代码, 能够创建两个线程, 对这个数组的所有元素求和.
        // 其中线程1 计算偶数下标元素的和, 线程2 计算奇数下标元素的和.
        // 线程1
        SumOperation sumOperation = new SumOperation();
        Thread thread1 = new Thread(() -> {
           // 偶数求和
            for (int i = 0; i < total; i += 2) {
                sumOperation.EvenSumOperation(array[i]);
            }
        });

        // 线程2
        Thread thread2 = new Thread(() -> {
            // 奇数求和
            for (int i = 1; i < total; i += 2) {
                sumOperation.OppSumOperation(array[i]);
            }
        });

        // 启动线程
        thread1.start();
        thread2.start();

        // 等待线程执行结束
        thread1.join();
        thread2.join();

        // 结果
        System.out.println("执行结果" + sumOperation.result());

        // 记录程序的执行时间.
        // 记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("执行时间：" + (end - start));
    }
}

// 创建一个类来求和
class SumOperation {
    long oppSum;// 奇数
    long evenSum;// 偶数

    // 求奇数的和
    public void OppSumOperation(int num) {
        oppSum += num;
    }

    // 求偶数的和
    public void EvenSumOperation(int num) {
        evenSum += num;
    }

    // 返回最终结果
    public long result() {
        System.out.println("偶数和：" + evenSum);
        System.out.println("奇数和：" + oppSum);
        return evenSum + oppSum;
    }
}
